grammar Potigol;

options {
  language = Java;
}

@header {
	package br.edu.ifrn.potigol;
}

@lexer::header {
	package br.edu.ifrn.potigol;
}

programa:
	'programa' IDENTIFICADOR '{'
		(constante | variavel | atribuicao)*
	'}'
;

tipo:
	'int'
;

constante:
	'constante' tipo CAIXAALTA '=' expressao
;

variavel:
	'val' tipo IDENTIFICADOR (',' IDENTIFICADOR)* ('=' expressao)?
;

atribuicao:
	IDENTIFICADOR '=' expressao
;

termo:
	IDENTIFICADOR | '(' expressao ')' | INTEIRO
;

negacao:
	'not'* termo
;

unario:
	('+' | '-')* negacao
;

multiplicacao:
	unario (('*' | '/' | 'mod') unario)*
;

adicao:
	multiplicacao (('+' | '-') multiplicacao)*
;

relacao:
	adicao (('==' | '!=' | '<' | '<=' | '>=' | '>') adicao)*
;

expressao:
	relacao (('&&' | '||') relacao)*
;

INTEIRO: '0'..'9'+;
CAIXAALTA: ('A'..'Z')('A'..'Z' | '0'..'9')*;
IDENTIFICADOR: ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'9')*;
ESPACO: ('\t' | ' ' | '\r' | '\n' | '\u000C' )+ { $channel = HIDDEN; };
